package ar.edu.utn.frba.tacs.warnes.entities;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Transient;

import org.apache.log4j.Logger;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import ar.edu.utn.frba.tacs.warnes.dao.BaseDaoImpl;
import ar.edu.utn.frba.tacs.warnes.dao.ReservaDao;

@Entity
public class Reserva extends BaseEntityImpl {
	@Transient
	Logger log = Logger.getLogger(Reserva.class);
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "PiezaSeq")
	@SequenceGenerator(name = "PiezaSeq", sequenceName = "PiezaSeq")
	private Long id;

	@OneToMany(mappedBy = "reserva", fetch = FetchType.LAZY)
	@Cascade(value = { CascadeType.PERSIST })
	private List<Pieza> piezasReservadas = new ArrayList<Pieza>();

	public Reserva(){
		this.log.debug("Se ha CREADO una nueva RESERVA de piezas con "
				+ this.getPiezasReservadas().size() + " items");	
	}
	
	/**
	 * Agrega una pieza a la reserva. La pieza pasa a tener su estado en
	 * 'Reservado'
	 * 
	 * @param pieza
	 */
	public void reservarPieza(Pieza pieza) {
		if (this.getPiezasReservadas() == null) {
			this.setPiezasReservadas(new ArrayList<Pieza>());
		}

		pieza.puedoReservarte();
		this.getPiezasReservadas().add(pieza);
		pieza.reservate(this);
		this.log.debug("La PIEZA " + pieza.getDescripcion()
				+ " fue reservada con exito");	
	}

	public void setPiezasReservadas(List<Pieza> piezasReservadas) {
		this.piezasReservadas = piezasReservadas;
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public List<Pieza> getPiezasReservadas() {
		return this.piezasReservadas;
	}

	/**
	 * Responde si la pieza es parte de esta reserva
	 * 
	 * @param pieza
	 * @return <b>true</b> si la pieza esta en la reserva <br>
	 *         <b>false</b> si la pieza no esta en la reserva
	 */
	public Boolean tienePieza(Pieza pieza) {
		if (this.getPiezasReservadas() != null) {
			return this.getPiezasReservadas().contains(pieza);
		} else {
			return false;
		}
	}

	@Override
	public void delete() {
		BaseDaoImpl<Reserva> dao = ReservaDao.getInstance();
		dao.delete(this);
	}

	@Override
	public void save() {
		BaseDaoImpl<Reserva> dao = ReservaDao.getInstance();
		dao.save(this);
	}

}
